package cn.com.common.job.task;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.quartz.DisallowConcurrentExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import cn.com.common.constants.Constants;
import cn.com.gas.constants.GasConstants;
import cn.com.gas.entity.GasApiEntity;
import cn.com.gas.entity.GasStationinfoEntity;
import cn.com.gas.service.GasApiService;
import cn.com.gas.service.GasStationinfoService;
import cn.com.system.entity.SysDept;
import cn.com.system.service.DeptService;
import cn.com.thirdparty.entity.VExJyzEntity;
import cn.com.thirdparty.entity.VExJyzMxEntity;
import cn.com.thirdparty.entity.VExSxtEntity;
import cn.com.thirdparty.entity.VExSxtJyzEntity;
import cn.com.thirdparty.entity.VExSxtMxEntity;
import cn.com.thirdparty.entity.VExSxtZxMxEntity;
import cn.com.thirdparty.service.VExJyzMxService;
import cn.com.thirdparty.service.VExJyzService;
import cn.com.thirdparty.service.VExSxtJyzService;
import cn.com.thirdparty.service.VExSxtMxService;
import cn.com.thirdparty.service.VExSxtService;
import cn.com.thirdparty.service.VExSxtZxMxService;
import cn.com.util.TsBqUtils;

/**
 * 定时任务(演示Demo，可删除) testTask为spring bean的名称， 方法名称必须是run
 *
 * @author wenbin
 * @version V1.0
 * @date 2020年3月18日
 */
@Component("gasVExJyzMxProcessTask")
@DisallowConcurrentExecution
public class GasVExJyzMxProcessTask {
	
	@Value("${gasstation.timedTask.gasVExJyzMxProcessTask}")
	private String gasVExJyzMxProcessTask;
	
	private Logger logger = LoggerFactory.getLogger(getClass());

	@Autowired
	private VExJyzService vExJyzService;
	@Autowired
	private VExJyzMxService vExJyzMxService;

	@Autowired
	private VExSxtService vExSxtService;
	@Autowired
	private VExSxtMxService vExSxtMxService;
	@Autowired
	private VExSxtZxMxService vExSxtZxMxService;

	@Autowired
	private VExSxtJyzService vExSxtJyzService;
	@Autowired
	private GasApiService gasApiService;
	
	@Autowired
	private GasStationinfoService gasStationinfoService;
	@Autowired
	private DeptService deptService;

	public void run(String params) throws Exception {
		logger.debug("gasVExJyzMxProcessTask定时任务正在执行，参数为：{}", params);
		logger.debug("application参数为gasVExJyzMxProcessTask：{}", gasVExJyzMxProcessTask);

		if (gasVExJyzMxProcessTask.equals(Constants.JOB_STOP)) {



			logger.debug("application配置文件控制不执行gasVExJyzMxProcessTask定时任务");
			throw new Exception("application配置文件控制不执行gasVExJyzMxProcessTask定时任务");
		
		
		
		}
		
		
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 加油站信息 v_ex_jyz表，v_ex_jyz_mx表,v_ex_sxt_jyz表
		LambdaQueryWrapper<GasStationinfoEntity> queryWrapper = Wrappers.lambdaQuery();
		queryWrapper.eq(GasStationinfoEntity::getType, "group");
		queryWrapper.eq(GasStationinfoEntity::getIsAnalyse, "Y");

		List<GasStationinfoEntity> records = gasStationinfoService.list(queryWrapper);
		List<String> stationinfoIds = new ArrayList<>();
		List<VExJyzMxEntity> jyzMxList = new ArrayList<>();

		for (GasStationinfoEntity gasStationinfoEntity : records) {
			String stationinfoId = gasStationinfoEntity.getId();

			// 将Date对象转换为指定格式的字符串
			String dateString = formatter.format(gasStationinfoEntity.getCreateTime());

			VExJyzMxEntity vExJyzMx = new VExJyzMxEntity();
			String taxorgcode = gasStationinfoEntity.getTaxorgcode();
			String name = gasStationinfoEntity.getName();
			SysDept sysDept = deptService.getById(taxorgcode);
			String taxorgname = taxorgcode;
			String xzqhmc = taxorgcode;
			if (TsBqUtils.isNotNull(sysDept)) {
				taxorgname = sysDept.getName();
				xzqhmc = sysDept.getManagerName();

			}

			vExJyzMx.setSwjgDm(taxorgcode); // 税务机关代码
			vExJyzMx.setSwjgMc(taxorgname); // 税务机关名称
			vExJyzMx.setId(stationinfoId); // 加油站ID
			vExJyzMx.setJyzMc(gasStationinfoEntity.getName()); // 加油站名称
			vExJyzMx.setJyzDz(""); // 加油站地址
			boolean contains = name.contains("中国");
			boolean contains1 = name.contains("中石油");
			boolean contains2 = name.contains("中石化");
			
			String sfsty = "否";
			if (contains||contains1||contains2) {
				sfsty = "是";
			}
			vExJyzMx.setSfsty(sfsty); // 是否三桶油
			vExJyzMx.setUpdatetime(dateString); // 加油站添加时间
			vExJyzMx.setXzqhDm(taxorgcode.substring(1,7)); // 行政区划代码
			vExJyzMx.setXzqhMc(xzqhmc); // 行政区划名称
			
			vExJyzMx.setJyzJc(gasStationinfoEntity.getShortname());
			
			jyzMxList.add(vExJyzMx);
			stationinfoIds.add(stationinfoId);

			vExJyzMxService.saveVExJyzMx(vExJyzMx); // 写入v_ex_jyz_mx

			VExSxtJyzEntity sxtJyz = new VExSxtJyzEntity();

			sxtJyz.setXzqhDm(taxorgcode.substring(1,7)); // 行政区划代码
			sxtJyz.setXzqhMc(xzqhmc); // 行政区划名称
			sxtJyz.setSwjgDm(taxorgcode); // 税务机关代码
			sxtJyz.setSwjgMc(taxorgname); // 税务机关名称
			sxtJyz.setId(stationinfoId); // 加油站编号
			sxtJyz.setJyzMc(name); // 加油站名称

			// int index = name.lastIndexOf("(");
			int zs = 0;
			int zx = 0;
			/*if (index != -1) {
				String substring = name.substring(index);
				if (TsBqUtils.isNotNull(substring)) {
					String[] split = substring.split("/");
					zx = Integer.parseInt(split[0].replace("(", ""));
					zs = Integer.parseInt(split[1].replace(")", ""));
				}
			}*/
			
			
			LambdaQueryWrapper<GasStationinfoEntity> camQueryWrapper = Wrappers.lambdaQuery();
			camQueryWrapper.in(GasStationinfoEntity::getPid, stationinfoId);
			camQueryWrapper.eq(GasStationinfoEntity::getType, "cam");

			List<GasStationinfoEntity> camList = gasStationinfoService.list(camQueryWrapper);
			
			if(TsBqUtils.isNotNull(camList)){
				for (GasStationinfoEntity cam : camList) {
					String iconSkin = cam.getIconSkin();
					zs ++ ;
					if (iconSkin.equals(GasConstants.ICON_SKIN_ON)) {
						zx ++ ;
					}
				}
			}
			
			sxtJyz.setSxtZs(zs); // 撮像头总数
			sxtJyz.setSxtZx(zx); // 撮像头在线数
			sxtJyz.setSxtLx(zs-zx); // 撮像头离线
			
			vExSxtJyzService.saveVExSxtJyz(sxtJyz); // 写入 v_ex_sxt_jyz

		}

		List<VExJyzEntity> jyzList = new ArrayList<>();

		Map<String, List<VExJyzMxEntity>> groupedItems = jyzMxList.stream().collect(Collectors.groupingBy(
				item -> item.getSwjgDm() + "_" + item.getSwjgMc() + "_" + item.getXzqhDm() + "_" + item.getXzqhMc()));

		groupedItems.forEach((category, itemsInCategory) -> {
			VExJyzEntity vExJyz = new VExJyzEntity();
			String[] arr = category.split("_");

			vExJyz.setSwjgDm(arr[0]); // swjg_dm 税务机关代码
			vExJyz.setSwjgMc(arr[1]); // swjg_mc 税务机关名称
			vExJyz.setXzqhDm(arr[2]); // xzqh_dm 行政区划代码
			vExJyz.setXzqhMc(arr[3]); // xzqh_mc 行政区划名称

			int[] i = { 0, 0 };
			itemsInCategory.forEach(item -> {
				String sfsty = item.getSfsty();
				if (sfsty.equals("是")) {
					i[0]++;
				} else {
					i[1]++;
				}
			});
			vExJyz.setJyz(i[0] + i[1]); // jyz 加油站
			vExJyz.setDfyz(i[1]); // dfyz 地方油站
			vExJyz.setStyz(i[0]); // styz 三桶油站
			jyzList.add(vExJyz);
		});
		
		
		
		VExJyzEntity vExJyzEntitySj = new VExJyzEntity();
		int dfyzSj = 0;
		int styzSj = 0;
		int jyzSj = 0;
		for (VExJyzEntity vExJyzEntity : jyzList) {
			dfyzSj = dfyzSj + vExJyzEntity.getDfyz();
			styzSj = styzSj + vExJyzEntity.getStyz();
			jyzSj = jyzSj + vExJyzEntity.getJyz();
			
			vExJyzService.saveVExJyzMx(vExJyzEntity); // 写入 v_ex_jyz
		}
		
		vExJyzEntitySj.setSwjgMc("国家税务总局张家口市税务局"); // 税务机关代码
		vExJyzEntitySj.setSwjgDm("11307000000"); // 税务机关名称
		vExJyzEntitySj.setDfyz(dfyzSj); // 地方油站
		vExJyzEntitySj.setStyz(styzSj); // 三桶油站
		vExJyzEntitySj.setJyz(jyzSj); // 加油站
		vExJyzEntitySj.setXzqhDm(""); // 行政区划代码
		vExJyzEntitySj.setXzqhMc(""); // 行政区划名称
		vExJyzService.saveVExJyzMx(vExJyzEntitySj);
		
		
		
		// 摄像头信息处理 v_ex_sxt表， v_ex_sxt_mx表 ，v_ex_sxt_zxmx表 TODO
		LambdaQueryWrapper<GasStationinfoEntity> queryWrapperCam = Wrappers.lambdaQuery();
		queryWrapperCam.in(GasStationinfoEntity::getPid, stationinfoIds);
		queryWrapperCam.eq(GasStationinfoEntity::getType, "cam");
		
		queryWrapperCam.notLike(GasStationinfoEntity::getName, "便利店");
		queryWrapperCam.notLike(GasStationinfoEntity::getName, "营业厅");
		queryWrapperCam.notLike(GasStationinfoEntity::getName, "财务室");
		queryWrapperCam.notLike(GasStationinfoEntity::getName, "洗车房");
		
		List<GasStationinfoEntity> camList = gasStationinfoService.list(queryWrapperCam);
		List<VExSxtMxEntity> vExSxtMxList = new ArrayList<>();

		for (GasStationinfoEntity camEntity : camList) {
			String dateString = formatter.format(camEntity.getCreateTime());

			VExSxtMxEntity vExSxtMx = new VExSxtMxEntity();

			String iconSkin = camEntity.getIconSkin();

			String stationinfoId = camEntity.getPid();
			GasStationinfoEntity stationinfoEntity = gasStationinfoService.getById(stationinfoId);
			String taxorgcode = stationinfoEntity.getTaxorgcode();
			SysDept dept = deptService.getById(taxorgcode);
			
			GasApiEntity gasApiEntity = gasApiService.getById(taxorgcode);
			String url = "";
			String ak = "";
			String sk = "";
			
			if(TsBqUtils.isNotNull(gasApiEntity)){
				url = gasApiEntity.getUrl();
				ak = gasApiEntity.getAk();
				sk = gasApiEntity.getSk();
				
			}
			
			vExSxtMx.setSwjgMc(dept.getName()); // swjg_mc 税务机关名称
			vExSxtMx.setSwjgDm(dept.getId()); // swjg_dm 税务机关代码
			vExSxtMx.setId(stationinfoId); // id 加油站ID
			vExSxtMx.setJyzMc(stationinfoEntity.getName()); // 加油站名称
			vExSxtMx.setSxtGlid(camEntity.getPlatformid()); // 撮像头-关联ID
			
			vExSxtMx.setSxtMc(camEntity.getName());// sxt_mc 撮像头名称
			vExSxtMx.setSxtLx("");// 撮像头类型
			vExSxtMx.setUpdatetime(dateString);

			vExSxtMx.setXzqhDm(taxorgcode.substring(1, 7));// xzqh_dm 行政区划代码
			vExSxtMx.setXzqhMc(dept.getManagerName());// xzqh_mc 行政区划名称

			if (iconSkin.equals(GasConstants.ICON_SKIN_ON)) {
				VExSxtZxMxEntity vExSxtZxMx = new VExSxtZxMxEntity();

				vExSxtZxMx.setSwjgDm(taxorgcode); // 税务机关代码
				vExSxtZxMx.setSwjgMc(dept.getName()); // 税务机关名称
				vExSxtZxMx.setId(stationinfoId); // 加油站ID
				vExSxtZxMx.setJyzMc(stationinfoEntity.getName()); // 加油站名称
				vExSxtZxMx.setSxtGlid(camEntity.getPlatformid()); // 撮像头-关联ID
				vExSxtZxMx.setSxtMc(""); // 撮像头名称
				vExSxtZxMx.setUpdatetime(dateString); // 撮像头添加时间
				vExSxtZxMx.setCreateTime(dateString); // 开始时间
				vExSxtZxMx.setSxtLx("");// sxt_lx // 撮像头类型
				
				vExSxtZxMx.setUrl(url);// url // 地址
				vExSxtZxMx.setUserName(ak); // 用户名
				vExSxtZxMx.setPassWord(sk); // 密码
				
				vExSxtZxMx.setXzqhDm(taxorgcode.substring(1, 7)); // 行政区划代码
				vExSxtZxMx.setXzqhMc(dept.getManagerName());// xzqh_mc // 行政区划名称

				vExSxtZxMxService.saveVExSxtZxMx(vExSxtZxMx);// v_ex_sxt_zxmx

				vExSxtMx.setOnline(GasConstants.ON_LINE);
			} else {
				vExSxtMx.setOnline(GasConstants.OFF_LINE);
			}

			vExSxtMxList.add(vExSxtMx);
			vExSxtMxService.saveVExSxtMx(vExSxtMx); // v_ex_sxt_mx

		}

		Map<Object, List<VExSxtMxEntity>> groupVExSxtMx = vExSxtMxList.stream().collect(Collectors.groupingBy(
				item -> item.getSwjgDm() + "_" + item.getSwjgMc() + "_" + item.getXzqhDm() + "_" + item.getXzqhMc()));
		List<VExSxtEntity> sxtList = new ArrayList<>();
		groupVExSxtMx.forEach((category, itemsInCategory) -> {
			VExSxtEntity sxt = new VExSxtEntity();
			String[] arr = category.toString().split("_");

			sxt.setSwjgDm(arr[0]); // swjg_dm 税务机关代码
			sxt.setSwjgMc(arr[1]); // swjg_mc 税务机关名称
			sxt.setXzqhDm(arr[2]); // xzqh_dm 行政区划代码
			sxt.setXzqhMc(arr[3]); // xzqh_mc 行政区划名称

			int[] i = { 0, 0 };
			itemsInCategory.forEach(item -> {
				String onlie = item.getOnline();
				i[0]++;
				if (onlie.equals(GasConstants.ON_LINE)) {
					i[1]++;
				}
			});

			sxt.setSxtZx(i[1]); // sxt_zx 撮像头在线数
			sxt.setSxtZs(i[0]); // sxt_zs 撮像头总数

			sxtList.add(sxt);

		});

		
		VExSxtEntity sxtEntitySj = new VExSxtEntity();
		int sxtZxSj = 0;
		int sxtZsSj = 0;
		for (VExSxtEntity sxtEntity : sxtList) {
			sxtZxSj = sxtZxSj + sxtEntity.getSxtZx();
			sxtZsSj = sxtZsSj + sxtEntity.getSxtZs();
			
			vExSxtService.saveVExSxt(sxtEntity); // 写入 v_ex_sxt
			
		}
		
		
		sxtEntitySj.setSwjgMc("国家税务总局张家口市税务局");// 税务机关代码
		sxtEntitySj.setSwjgDm("11307000000");// 税务机关名称
		sxtEntitySj.setSxtZs(sxtZsSj);// 撮像头总数
		sxtEntitySj.setSxtZx(sxtZxSj);// 撮像头在线数 
		sxtEntitySj.setXzqhDm("");// 行政区划代码
		sxtEntitySj.setXzqhMc("");// 行政区划名称
		
		
		vExSxtService.saveVExSxt(sxtEntitySj);
	}

}
